题目描述:
编写一个高效的算法来搜索 m x n
矩阵 matrix
中的一个目标值 target
。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例 1:
1 | 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5 |
示例 2:
1 | 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20 |
提示:
- $m == matrix.length$
- $n == matrix[i].length$
- $1 <= n, m <= 300$
- $-10^9 <= matix[i][j] <= 10^9$
- 每行的所有元素从左到右升序排列
- 每列的所有元素从上到下升序排列
- $-10^9 <= target <= 10^9$
链接:
https://leetcode-cn.com/problems/search-a-2d-matrix-ii
题目分析
因为矩阵是相对有序的,对于一个节点,若 target 比它小,则只能在左边或者上边;若 target 比它大,则只能在右边或者下边。这样搜索路径有两条不好选择。如果我们从左下角开始搜索,若 target 小则只能往上边搜索,若 target 大则只能往右边搜索,我们只规定两个合法的移动方向,由于严格的大小关系,若 target 存在是一定不会错过的。同理,从右上角往左下角搜索也是可以的。
1 | class Solution { |
时间复杂度:$O(m+n)$,其中 $m、n$ 分别为二维矩阵的行数和列数。我们的搜索方向只有右和上,最多只能走过 $m+n-1$ 步到达右上角。
空间复杂度:$O(1)$。我们只需要根据搜索得到的大小进行移动,只需要常数个变量的空间。
PS:官方题解中还有二分法等高端操作,非常复杂,时间复杂度也没有比这个好,就没有进行学习,这种方法还是十分巧妙和简洁的。